const std = @import("std");

// 测试函数0：基础输出
fn test0() void {
    std.debug.print("===== 测试0: 基础输出 =====\n", .{});
    std.debug.print("Hello, Zig!\n", .{});
    std.debug.print("数字: {d}, 字符串: {s}\n\n", .{42, "Zig语言"});
}

// 测试函数1：基本类型和操作
fn test1() void {
    std.debug.print("===== 测试1: 基本类型和操作 =====\n", .{});
    const a: i32 = 10;
    const b: u32 = 20;
    const c: f64 = 3.14159;
    const d: bool = true;
    
    std.debug.print("整数相加: {d} + {d} = {d}\n", .{a, b, a + @as(i32, b)});
    std.debug.print("浮点数: {d:.2}\n", .{c});
    std.debug.print("布尔值: {}\n\n", .{d});
}

// 测试函数2：数组和切片
fn test2() void {
    std.debug.print("===== 测试2: 数组和切片 =====\n", .{});
    const array = [_]i32{ 1, 2, 3, 4, 5 };
    const slice = array[1..4]; // 切片，包含索引1到3的元素
    
    std.debug.print("数组: {any}\n", .{array});
    std.debug.print("切片: {any}\n", .{slice});
    
    var sum: i32 = 0;
    for (array) |item| {
        sum += item;
    }
    std.debug.print("数组元素和: {d}\n\n", .{sum});
}

// 测试函数3：控制流
fn test3() void {
    std.debug.print("===== 测试3: 控制流 =====\n", .{});
    
    // if-else 语句
    const x: i32 = 7;
    if (x > 5) {
        std.debug.print("{d} 大于 5\n", .{x});
    } else if (x < 5) {
        std.debug.print("{d} 小于 5\n", .{x});
    } else {
        std.debug.print("{d} 等于 5\n", .{x});
    }
    
    // for 循环
    std.debug.print("循环计数: ", .{});
    for (0..5) |i| {
        std.debug.print("{d} ", .{i});
    }
    std.debug.print("\n\n", .{});
}

// 测试函数4：函数和返回值
fn add(a: i32, b: i32) i32 {
    return a + b;
}

fn multiply(a: i32, b: i32) i32 {
    return a * b;
}

fn test4() void {
    std.debug.print("===== 测试4: 函数和返回值 =====\n", .{});
    
    const result1 = add(10, 20);
    const result2 = multiply(10, 20);
    
    std.debug.print("10 + 20 = {d}\n", .{result1});
    std.debug.print("10 * 20 = {d}\n\n", .{result2});
}

// 测试函数5：错误处理
fn divide(a: i32, b: i32) !i32 {
    if (b == 0) {
        return error.DivisionByZero;
    }
    return @divTrunc(a, b);
}

fn test5() void {
    std.debug.print("===== 测试5: 错误处理 =====\n", .{});
    
    // 正常情况
    const result1 = divide(10, 2) catch |err| {
        std.debug.print("错误: {}\n", .{err});
        return;
    };
    std.debug.print("10 / 2 = {d}\n", .{result1});
    
    // 错误情况
    const result2 = divide(10, 0) catch |err| {
        std.debug.print("捕获到错误: {}\n", .{err});
        return; // void函数不能返回值
    };
    std.debug.print("结果: {d}\n\n", .{result2});
}

// 测试函数6：结构体
const Person = struct {
    name: []const u8,
    age: u8,
    
    fn greet(self: Person) void {
        std.debug.print("你好，我是{s}，今年{d}岁\n", .{self.name, self.age});
    }
};

fn test6() void {
    std.debug.print("===== 测试6: 结构体 =====\n", .{});
    
    const person = Person{ .name = "Zig学习者", .age = 25 };
    person.greet();
    std.debug.print("结构体字段访问: 姓名={s}, 年龄={d}\n\n", .{person.name, person.age});
}

// 主函数，依次运行所有测试
pub fn main() !void {
    std.debug.print("开始运行Zig测试程序\n\n", .{});
    
    test0();
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
    
    std.debug.print("所有测试运行完毕！\n", .{});
}